//package com.zmn.plat.manager.impl.search;
//
//import com.zmn.common.constant.GlobalConsts;
//import com.zmn.plat.manager.utils.MqConsts;
//import com.zmn.common.utils.date.DateUtil;
//import com.zmn.common.utils.reflect.CopyObjectUtil;
//import com.zmn.common.utils.string.StringUtil;
//import com.zmn.manager.elastic.utils.SpringDataUtil;
//import com.zmn.plat.manager.interfaces.cache.NewsCategoryCache;
//import com.zmn.plat.manager.interfaces.search.NewsRepository;
//import com.zmn.plat.model.dto.MQNewsDTO;
//import com.zmn.plat.model.dto.NewsDTO;
//import com.zmn.plat.model.entity.news.News;
//import com.zmn.plat.persistence.interfaces.news.NewsDao;
//import org.slf4j.Logger;
//import org.elasticsearch.action.bulk.BulkRequestBuilder;
//import org.elasticsearch.action.bulk.BulkResponse;
//import org.elasticsearch.action.delete.DeleteRequestBuilder;
//import org.elasticsearch.action.delete.DeleteResponse;
//import org.elasticsearch.action.get.GetRequestBuilder;
//import org.elasticsearch.action.index.IndexRequestBuilder;
//import org.elasticsearch.action.index.IndexResponse;
//import org.elasticsearch.action.update.UpdateRequestBuilder;
//import org.elasticsearch.action.update.UpdateResponse;
//import org.elasticsearch.client.transport.TransportClient;
//import org.elasticsearch.common.xcontent.XContentBuilder;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
///**
// * @author nowind
// * @since 2017/10/20 16:14
// */
//@Service
//public class NewsRepositoryImpl implements NewsRepository {
//    private Logger logger = LoggerFactory.getLogger(NewsRepositoryImpl.class);
//
//    private final static String NEWS_INDEX   = "zmn_plat";  //news所在的索引
//    private final static String NEWS_TYPE    = "n_news";    //news对应的类型
//
//    @Resource
//    private NewsDao newsDao;
//    @Resource
//    private NewsCategoryCache newsCategoryCache;
//    @Autowired
//    private TransportClient transportClient;
//
//
//    //region 更新News
//    @Override
//    public boolean updateNews(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE) {
//            return this.updateNews(mq.getNewsId());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateNews(int newsId) {
//
//        try {
//
//            News news = newsDao.findByKey(newsId);
//            NewsDTO doc = this.initNews(news);
//
//            XContentBuilder scb = this.buildXContentBuilder(doc);
//            UpdateRequestBuilder urb = this.getUpdateResponse(doc.getNewsId());
//            urb.setDocAsUpsert(true);   //不存在则创建
//
//            UpdateResponse response = urb.setDoc(scb).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引news doc成功,newsId:[%s],result:[%s]", newsId, response.status()));    // //response.status:OK or CREATED(不存在时)
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引news doc出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));
//            return false;
//        }
//    }
//
//    //region 更新News(批量更新)
//    @Override
//    public boolean updateNews(List<News> items) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//            //String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            for(News news: items) {
//
//                NewsDTO doc = this.initNews(news);
//
//                XContentBuilder scb = this.buildXContentBuilder(doc);
//                UpdateRequestBuilder urb = this.getUpdateResponse(doc.getNewsId());
//                urb.setDocAsUpsert(true);
//
//                urb.setDoc(scb);
//
//                bulk.add(urb);
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量更新索引news doces成功,count:[%s],result:[%s]", items.size(), response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量更新索引news doces出错,count:[%s],ex:[%s]", items.size(), ex.getMessage()));
//            return true;
//        }
//    }
//    //endregion
//
//    //endregion
//
//    //region 更新News主图
//    @Override
//    public boolean updateNewsImgSrc(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_IMGSRC) {
//            return this.updateNewsImgSrc(mq.getNewsId(), mq.getImgSrc(), mq.getUpdateTime());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateNewsImgSrc(int newsId, String imgSrc, Date updateTime) {
//
//        try {
//
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("newsId", newsId);
//            map.put("imgSrc", imgSrc);
//            map.put("updateTime", nowTime);
//
//            UpdateResponse response = this.getUpdateResponse(newsId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引news imgSrc成功,newsId:[%s],result:[%s]", newsId, response.status()));
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引news imgSrc出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//    //region 更新News状态
//    @Override
//    public boolean updateNewsStatus(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_STATUS) {
//            return this.updateNewsStatus(mq.getNewsId(), mq.getStatus(), mq.getUpdateTime());
//        } else if(type == MqConsts.INDEX_TYPE_UPDATE_STATUS_BATCH) {
//            return this.updateNewsStatus(StringUtil.convertStrsToList(mq.getNewsIds()), mq.getStatus(), mq.getUpdateTime());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateNewsStatus(List<Integer> newsIds, int status, Date updateTime) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            for (Integer newsId : newsIds) {
//                Map<String, Object> map = new HashMap<>();
//                map.put("newsId", newsId);
//                map.put("status", status);
//                map.put("updateTime", nowTime);
//                bulk.add(this.getUpdateResponse(newsId).setDoc(map));
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量更新索引news status成功,newsIds:[%s],result:[%s]", newsIds, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量更新索引news status出错,newsIds:[%s],ex:[%s]", newsIds, ex.getMessage()));
//            return true;
//        }
//    }
//    @Override
//    public boolean updateNewsStatus(int newsId, int status, Date updateTime) {
//
//        try {
//
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("newsId", newsId);
//            map.put("status", status);
//            map.put("updateTime", nowTime);
//
//            UpdateResponse response = this.getUpdateResponse(newsId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引news status成功,newsId:[%s],result:[%s]", newsId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引news status出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//    //region 更新News排序
//    @Override
//    public boolean updateNewsSort(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_SORT) {
//            return this.updateNewsSort(mq.getNewsId(), mq.getSort());
//        } else if(type == MqConsts.INDEX_TYPE_UPDATE_SORT_BATCH) {
//            return this.updateNewsSort(StringUtil.convertStrsToList(mq.getNewsIds()), StringUtil.convertStrsToList(mq.getSorts()));
//        }
//        return false;
//    }
//    @Override
//    public boolean updateNewsSort(List<Integer> newsIds, List<Integer> sorts) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//
//            for(int i=0; i<newsIds.size(); i++) {
//                Map<String, Object> map = new HashMap<>();
//                map.put("newsId", newsIds.get(i));
//                map.put("sort", sorts.get(i));
//                bulk.add(this.getUpdateResponse(newsIds.get(i)).setDoc(map));
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量更新索引news sort成功,newsIds:[%s],result:[%s]", newsIds, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量更新索引news sort出错,newsIds:[%s],ex:[%s]", newsIds, ex.getMessage()));
//            return true;
//        }
//    }
//    @Override
//    public boolean updateNewsSort(int newsId, int sort) {
//
//        try {
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("newsId", newsId);
//            map.put("sort", sort);
//
//            UpdateResponse response = this.getUpdateResponse(newsId).setDoc(map).execute().actionGet();
//
//           //logger.info(String.format("[zmn]更新索引news sort成功,newsId:[%s],result:[%s]", newsId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引news sort出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//    //region 更新News修改时间
//    @Override
//    public boolean updateNewsUpdateTime(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_UPDATE_UPDATETIME) {
//            return this.updateNewsUpdateTime(mq.getNewsId(), mq.getUpdateTime());
//        }
//        return false;
//    }
//    @Override
//    public boolean updateNewsUpdateTime(int newsId, Date updateTime) {
//
//        try {
//
//            String nowTime = DateUtil.toString(updateTime, DateUtil.FORMAT_DEFAULT);
//
//            Map<String, Object> map = new HashMap<>();
//            map.put("newsId", newsId);
//            map.put("updateTime", nowTime);
//
//            UpdateResponse response = this.getUpdateResponse(newsId).setDoc(map).execute().actionGet();
//
//            //logger.info(String.format("[zmn]更新索引news updateTime成功,newsId:[%s],result:[%s]", newsId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]更新索引news updateTime出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//
//    //region 创建News
//    @Override
//    public boolean addNews(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_ADD) {
//            return this.addNews(mq.getNewsId());
//        }
//        return false;
//    }
//    @Override
//    public boolean addNews(int newsId) {
//
//        try {
//
//            News news = newsDao.findByKey(newsId);
//            NewsDTO doc = this.initNews(news);
//
//            XContentBuilder scb = this.buildXContentBuilder(doc);
//            IndexRequestBuilder irb = this.getIndexResponse(newsId);
//
//            IndexResponse response = irb.setSource(scb).execute().actionGet();
//
//            //logger.info(String.format("[zmn]创建索引news doc成功,newsId:[%s],result:[%s]", newsId, response.status()));    //response.status:CREATED
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]创建索引news doc出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));
//            return false;
//        }
//    }
//    //endregion
//
//
//    //region 删除News
//    @Override
//    public boolean removeNews(MQNewsDTO mq) {
//
//        int type = mq.getType();
//        if(type == MqConsts.INDEX_TYPE_DELETE) {
//            return this.removeNews(mq.getNewsId());
//        } else if(type == MqConsts.INDEX_TYPE_DELETE_BATCH) {
//            return this.removeNews(StringUtil.convertStrsToList(mq.getNewsIds()));
//        }
//        return false;
//    }
//    @Override
//    public boolean removeNews(List<Integer> newsIds) {
//
//        try {
//
//            BulkRequestBuilder bulk = transportClient.prepareBulk();
//
//            for (Integer newsId : newsIds) {
//                bulk.add(this.getDeletResponse(newsId));
//            }
//
//            BulkResponse response = bulk.execute().actionGet();
//
//            //logger.info(String.format("[zmn]批量删除索引news doces成功,newsIds:[%s],result:[%s]", newsIds, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]批量删除索引news doces出错,newsIds:[%s],ex:[%s]", newsIds, ex.getMessage()));
//            return true;
//        }
//    }
//    @Override
//    public boolean removeNews(int newsId) {
//
//        try {
//
//            DeleteResponse response = this.getDeletResponse(newsId).execute().actionGet();
//
//            //logger.info(String.format("[zmn]删除索引news doc成功,newsId:[%s],result:[%s]", newsId, response.status()));    //response.status:OK
//            return true;
//
//        } catch (Exception ex) {
//
//            logger.error(String.format("[zmn]删除索引news doc出错,newsId:[%s],ex:[%s]", newsId, ex.getMessage()));  //response.status:NOT_FOUND
//            return false;
//        }
//    }
//    //endregion
//
//
//    //region initNews
//    private NewsDTO initNews(News news) {
//
//        NewsDTO newsDTO = new NewsDTO();
//
//        CopyObjectUtil<News, NewsDTO> copyObjectUtil = new CopyObjectUtil<>(news, newsDTO);
//        copyObjectUtil.copy();
//
//
//        if(newsDTO.getCategOneId() > GlobalConsts.TOP_ID)
//            newsDTO.setCategOneName(newsCategoryCache.getCategory(newsDTO.getCategOneId()).getCategName());
//        if(newsDTO.getCategTwoId() > GlobalConsts.TOP_ID)
//            newsDTO.setCategTwoName(newsCategoryCache.getCategory(newsDTO.getCategTwoId()).getCategName());
//
//        if(!StringUtil.isBlank(news.getKeyword())){
//            List<String> list = StringUtil.splitStrs(newsDTO.getKeyword(), "");
//            //String keywords = String.format("[%s]", StringUtil.convertListToStrs2(list));   //格式如:["aa","bb","cc"]
//            newsDTO.setKeywords(list);
//        }
//
//        return newsDTO;
//    }
//    //endregion
//
//    //region buildXContentBuilder
//
//    /**
//     * 构建XContentBuilder,深度2
//     */
//    public XContentBuilder buildXContentBuilder(NewsDTO doc) {
//        return SpringDataUtil.buildXContentBuilder(doc.getClass(), doc, 2);
//    }
//
//    //endregion
//
//    //region getResponse
//    private GetRequestBuilder getGetResponse(int newsId){
//        return transportClient.prepareGet(NEWS_INDEX, NEWS_TYPE, String.valueOf(newsId));
//    }
//
//    private UpdateRequestBuilder getUpdateResponse(int newsId){
//        return transportClient.prepareUpdate(NEWS_INDEX, NEWS_TYPE, String.valueOf(newsId));
//    }
//
//    private IndexRequestBuilder getIndexResponse(int newsId){
//        return transportClient.prepareIndex(NEWS_INDEX, NEWS_TYPE, String.valueOf(newsId));
//    }
//
//    private DeleteRequestBuilder getDeletResponse(int newsId){
//        return transportClient.prepareDelete(NEWS_INDEX, NEWS_TYPE, String.valueOf(newsId));
//    }
//    //endregion
//}
